package com.school.sports.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 成绩表实体类
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("score")
public class Score {

    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 用户ID
     */
    @NotNull(message = "用户ID不能为空")
    private Long userId;

    /**
     * 项目ID
     */
    @NotNull(message = "项目ID不能为空")
    private Long projectId;

    /**
     * 轮次
     */
    @Min(value = 1, message = "轮次至少为1")
    @Max(value = 10, message = "轮次不能超过10")
    private Integer round;

    /**
     * 成绩数值
     */
    @Digits(integer = 7, fraction = 2, message = "成绩数值整数部分最多7位，小数部分最多2位")
    private BigDecimal scoreValue;

    /**
     * 单位：秒、米、分等
     */
    @Size(max = 10, message = "成绩单位长度不能超过10个字符")
    private String scoreUnit;

    /**
     * 录入裁判ID
     */
    @NotNull(message = "裁判ID不能为空")
    private Long refereeId;

    /**
     * 状态：待审核、已公示、已驳回、有异议
     */
    private String status;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String note;

    /**
     * 创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    private LocalDateTime updatedAt;

    /**
     * 用户对象（关联查询时使用）
     */
    @TableField(exist = false)
    private User user;

    /**
     * 项目对象（关联查询时使用）
     */
    @TableField(exist = false)
    private Project project;

    /**
     * 裁判对象（关联查询时使用）
     */
    @TableField(exist = false)
    private User referee;

    /**
     * 排名信息（关联查询时使用）
     */
    @TableField(exist = false)
    private Integer ranking;

    /**
     * 成绩状态枚举
     */
    public enum ScoreStatus {
        PENDING("待审核"),
        PUBLISHED("已公示"),
        REJECTED("已驳回"),
        DISPUTED("有异议");

        private final String displayName;

        ScoreStatus(String displayName) {
            this.displayName = displayName;
        }

        public String getDisplayName() {
            return displayName;
        }

        /**
         * 根据显示名称获取枚举值
         */
        public static ScoreStatus fromDisplayName(String displayName) {
            for (ScoreStatus status : ScoreStatus.values()) {
                if (status.getDisplayName().equals(displayName)) {
                    return status;
                }
            }
            return null;
        }
    }

    /**
     * 设置成绩状态
     */
    public void setStatus(String status) {
        this.status = status;
    }

    /**
     * 获取成绩状态显示名称
     */
    public String getStatusDisplayName() {
        ScoreStatus statusEnum = ScoreStatus.fromDisplayName(this.status);
        return statusEnum != null ? statusEnum.getDisplayName() : this.status;
    }

    /**
     * 检查是否可以审核
     */
    public boolean canAudit() {
        return "待审核".equals(this.status);
    }

    /**
     * 检查是否可以修改
     */
    public boolean canModify() {
        return "待审核".equals(this.status) || "已驳回".equals(this.status);
    }

    /**
     * 检查是否可以删除
     */
    public boolean canDelete() {
        return "待审核".equals(this.status) || "已驳回".equals(this.status);
    }

    /**
     * 检查是否已公示
     */
    public boolean isPublished() {
        return "已公示".equals(this.status);
    }

    /**
     * 检查是否被驳回
     */
    public boolean isRejected() {
        return "已驳回".equals(this.status);
    }

    /**
     * 检查是否有异议
     */
    public boolean isDisputed() {
        return "有异议".equals(this.status);
    }

    /**
     * 获取格式化的成绩值
     */
    public String getFormattedScore() {
        if (scoreValue == null) {
            return "-";
        }
        return scoreValue.stripTrailingZeros().toPlainString() + (scoreUnit != null ? scoreUnit : "");
    }

    /**
     * 检查成绩是否有效
     */
    public boolean isValidScore() {
        return scoreValue != null && scoreValue.compareTo(BigDecimal.ZERO) > 0;
    }

    /**
     * 比较成绩（用于排名）
     * @param other 另一个成绩
     * @return 比较结果：-1表示当前成绩更好，0表示相等，1表示另一个成绩更好
     */
    public int compareScore(Score other) {
        if (other == null || other.getScoreValue() == null) {
            return -1;
        }
        if (this.getScoreValue() == null) {
            return 1;
        }

        // 径赛项目数值越小越好，田赛项目数值越大越好
        if (this.getProject() != null && other.getProject() != null) {
            boolean isTrack = "径赛".equals(this.getProject().getType());

            if (isTrack) {
                return this.getScoreValue().compareTo(other.getScoreValue());
            } else {
                return other.getScoreValue().compareTo(this.getScoreValue());
            }
        }

        return this.getScoreValue().compareTo(other.getScoreValue());
    }
}